#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>    /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>

/*
pthread_cond_t cond;
int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t * attr);

pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //静态初始化

加入
//阻塞等待一个条件变量
int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);
//限时等待一个条件变量
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);

abstime 示例
time_t cur = time(NULL);// 获取当前时间。
struct timespec t; //定义 timespec 结构体变量 t
t.tv_sec = cur+1; //定时 1 秒
pthread_cond_timedwait (&cond, &mutex, &t); //传参

唤醒
int pthread_cond_broadcast(pthread_cond_t *cond);//广播： 唤醒所有在条件变量中等待的线程
int pthread_cond_signal(pthread_cond_t *cond);//单播： 随机唤醒(至少)一个在条件变量中等待的线程

销毁
int pthread_cond_destroy(pthread_cond_t *cond);
*/

int money = 2000;
pthread_mutex_t mutex;

void *routine1(void *arg)
{
    pthread_mutex_lock(&mutex); // 上锁

    // 条件不满足的时候进入条件变量中等待
    while (money < 1000)
    {
        printf("线程1等待中...\n");
        sleep(1);
    }
    money -= 1000;
    printf("routine1 拿到钱了，当前银行卡余额:%d\n", money);

    pthread_mutex_unlock(&mutex); // 解锁

    // 主动退出 --走人
    pthread_exit(NULL);
}
void *routine2(void *arg)
{
    pthread_mutex_lock(&mutex); // 上锁

    // 条件不满足的时候进入条件变量中等待
    while (money < 1000)
    {
        printf("线程2等待中...\n");
        sleep(1);
    }
    money -= 1000;
    printf("routine2 拿到钱了，当前银行卡余额:%d\n", money);

    pthread_mutex_unlock(&mutex); // 解锁

    // 主动退出 --走人
    pthread_exit(NULL);
}
void *routine3(void *arg)
{
    pthread_mutex_lock(&mutex); // 上锁

    // 条件不满足的时候进入条件变量中等待
    while (money < 1000)
    {
        printf("线程3等待中...\n");
        sleep(1);
    }
    money -= 1000;
    printf("routine3 拿到钱了，当前银行卡余额:%d\n", money);

    pthread_mutex_unlock(&mutex); // 解锁

    // 主动退出 --走人
    pthread_exit(NULL);
}
void *routine4(void *arg)
{
    pthread_mutex_lock(&mutex); // 上锁

    // 条件不满足的时候进入条件变量中等待
    while (money < 1000)
    {
        printf("线程4等待中...\n");
        sleep(1);
    }
    money -= 1000;
    printf("routine4 拿到钱了，当前银行卡余额:%d\n", money);

    pthread_mutex_unlock(&mutex); // 解锁

    // 主动退出 --走人
    pthread_exit(NULL);
}

int main()
{
    pthread_mutex_init(&mutex, NULL);

    pthread_t thead1;
    pthread_create(&thead1, NULL, routine1, NULL);
    pthread_t thead2;
    pthread_create(&thead2, NULL, routine2, NULL);
    pthread_t thead3;
    pthread_create(&thead3, NULL, routine3, NULL);
    pthread_t thead4;
    pthread_create(&thead4, NULL, routine4, NULL);

    //====
    for (int i = 0; i < 5; i++) // 等待5s,之后，父亲过来打钱了
    {
        printf("当前延时%d\n", i);
        sleep(1);
    }
    printf("父亲第一次准备打钱了.....\n");
    // 根据子线程的状态 在这里判断当前有没有线程在等待
    // pthread_mutex_lock(&mutex);   // 上锁
    money += 1000; // 打钱
    // pthread_mutex_unlock(&mutex); // 解锁
    // ====

    //====
    for (int i = 0; i < 5; i++) // 等待5s,之后，父亲过来打钱了
    {
        printf("2222当前延时%d\n", i);
        sleep(1);
    }
    printf("父亲第222次准备打钱了.....\n");
    // 根据子线程的状态 在这里判断当前有没有线程在等待
    // pthread_mutex_lock(&mutex);   // 上锁
    money += 1000; // 打钱
    // pthread_mutex_unlock(&mutex); // 解锁
    // ====
    pthread_join(thead1, NULL);
    pthread_join(thead2, NULL);
    pthread_join(thead3, NULL);
    pthread_join(thead4, NULL);

    return 0;
}
